package com.zzl.bonds.ticket.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zzl.bonds.ticket.dto.*;
import com.zzl.bonds.ticket.dto.feign.ApprovalSubmitDto;
import com.zzl.bonds.ticket.dto.feign.NoticeApprovalResult;
import com.zzl.bonds.ticket.dto.ticketopen.OpenDetailDto;
import com.zzl.bonds.ticket.dto.ticketopen.OpenTicketCheckDetailDto;
import com.zzl.bonds.ticket.dto.ticketopen.RepayPlanPage;
import com.zzl.bonds.ticket.dto.ticketopen.TicketOpenSignDetailDto;
import com.zzl.bonds.ticket.entity.TicketOpenEntity;
import com.zzl.general.common.exception.SysException;
import com.zzl.general.common.serurity.entity.User;
import com.zzl.general.common.utils.PageUtils;

import java.util.List;
import java.util.Map;

/**
 * 开立申请表
 *
 * @author sunpp
 * @date 2022-02-16 14:04:05
 */
@SuppressWarnings("javadoc")
public interface TicketOpenService extends IService<TicketOpenEntity> {

    /**
     * 分页查询
     *
     * @param params 查询参数
     * @return 分页数据
     */
    PageUtils queryPage(Map<String, Object> params, User user) throws SysException;

    /**
     * 获取开票前的信息
     *
     * @param user 当前登录用户
     * @return
     * @throws SysException 业务异常
     */
    OpenPremiseDto getOpenPremise(User user) throws SysException;

    /**
     * 新增
     *
     * @param ticketOpenAddDto 新增实体
     * @param user             当前登录用户
     * @return 凭证id
     * @throws SysException 业务异常
     */
    String saveTicketOpen(TicketOpenAddDto ticketOpenAddDto, User user) throws SysException;

    /**
     * 开立签收笔数（今日）：当天已经签收了的笔数是多少 签收完成的
     * 开立签收金额（今日）：当天已经签收了的金额时多少 签收完成的金额
     * 开立签收中金额：所有处理状态为签收中的票据的金额 所有状态为签收中金额
     * <p>
     * 2022/1/24 开立签收笔数，开立签收今日
     *
     * @param user 当前登录用户
     * @return 开立签收的 统计数据
     */
    StatisticsDataDto getOpenSignData(User user);


    StatisticsDataDto getOpenData(User user);

    /**
     * 查询票详情
     *
     * @param id   开票列表id
     * @param user 当前登录用户
     * @return 票据详情
     * @throws SysException 业务异常
     */
    OpenDetailDto getOpenDetail(String id, User user) throws SysException;

    /**
     * 查询票详情 签收
     *
     * @param id   开票列表id
     * @param user 当前登录用户
     * @return 票据详情
     * @throws SysException 业务异常
     */
    OpenDetailDto getTicketOpenSignDetail(String id, User user) throws SysException;

    /**
     * 查询开单复核详情
     *
     * @param id   开单id
     * @param user 登录用户
     * @return 票据详情
     * @throws SysException 业务异常
     */
    OpenDetailDto getOpenTicketCheckDetailDto(String id, User user) throws SysException;

    /**
     * 开单复核列表
     *
     * @param params 开单参数
     * @param user   登录用户
     * @return
     * @throws SysException 业务异常
     */
    PageUtils queryOpenChekPage(Map<String, Object> params, User user) throws SysException;

    /**
     * 分页查询开单待平台审批
     *
     * @param params 查询参数
     * @return 分页数据
     */
    PageUtils queryOpenApprovePage(Map<String, Object> params);

    /**
     * 开立复核提交
     *
     * @param checkSubmit 复核提交参数
     * @param user        登录用户
     * @throws SysException 业务异常
     */
    void openTicketCheckSubmit(ApprovalSubmitDto checkSubmit, User user) throws SysException;

    /**
     * 开单 平台审批的提交
     *
     * @param checkSubmit 审批结果
     * @param user        登录用户
     * @throws SysException 业务异常
     */

    void openTicketApproveSubmit(ApprovalSubmitDto checkSubmit, User user) throws SysException;

    /**
     * 开单签收接口
     *
     * @param params 参数
     * @param user   用户
     * @return 分页数据v
     * @throws SysException 业务异常
     */
    PageUtils queryOpenSignPage(Map<String, Object> params, User user) throws SysException;

    /**
     * 开立签收的 提交
     *
     * @param checkSubmit 提交对象
     * @param user        登录用户
     * @throws SysException 业务异常
     */
    void openTicketSignSubmit(ApprovalSubmitDto checkSubmit, User user) throws SysException;

    /**
     * 撤销开单
     *
     * @param id   主键id
     * @param user 登录用户
     */
    void cancelOpenTicket(String id, User user) throws SysException;

    /**
     * 回滚 开立以及开立签收的数据
     * 1. 开立申请 终止
     * 2. 授信一个时集团的综合授信
     * 3. 供应商的开票额度
     *
     * @param days 天数 周期
     */
    void executeWaitingPayment(Integer days) throws SysException;

    IPage<CashTicketPage> cashingPage(IPage<CashTicketPage> page, Map<String, Object> params);

    void approveEndNotice(NoticeApprovalResult noticeApprovalResult, User user) throws SysException;

    /**
     * 重新申请
     *
     * @param id   开票id
     * @param user 用户
     */
    void reapplyOpenTicket(String id, User user) throws SysException;

    /**
     * 开立的流程进度
     *
     * @param id 开立id
     * @return 流程进度集合
     */
    List<ApUserShowInfo> getOpenProcessProgress(String id) throws SysException;

    /**
     * 核心企业概况-还款计划
     *
     * @param user 登录用户
     * @return 还款计划列表
     */
    PageUtils repayPlan(Map<String, Object> params, User user) throws SysException;
}

